#include "RingBuffer.hpp"
#include <unistd.h>
using namespace RingBufferModule;
using namespace MutexData;

Mutex lock1;
Mutex lock2;

// 生产
void *production(void *age)
{
	RingBuffer<int> *ring_buffer = static_cast<RingBuffer<int> *>(age);
	int data = 0;
	while (true)
	{

		ring_buffer->Equeue(data);
		{
			LockGuard lockguard(lock1);
			std::cout << "生产了一个数据......: " << data << std::endl;
		}
		data++;
	}
	return nullptr;
}

// 消费
void *consume(void *age)
{
	RingBuffer<int> *ring_buffer = static_cast<RingBuffer<int> *>(age);
	while (true)
	{
		sleep(1);
		int data;
		ring_buffer->Pop(&data);
		{
			LockGuard lockguard(lock2);

			std::cout << "消费了一个数据: " << data << std::endl;
		}
	}
	return nullptr;
}

int main()
{
	// 多生产 多消费  就要保证生产者和生产者，消费者和消费者之间互斥关系 需要两把锁
	RingBuffer<int> *ring_buffer = new RingBuffer<int>(5); // 共享资源 -> 临界资源
	pthread_t c1, p1, c2, c3, p2;
	pthread_create(&c1, nullptr, consume, ring_buffer);
	pthread_create(&c2, nullptr, consume, ring_buffer);
	pthread_create(&c3, nullptr, consume, ring_buffer);
	pthread_create(&p1, nullptr, production, ring_buffer);
	pthread_create(&p2, nullptr, production, ring_buffer);

	pthread_join(c1, nullptr);
	pthread_join(c2, nullptr);
	pthread_join(c3, nullptr);
	pthread_join(p1, nullptr);
	pthread_join(p2, nullptr);

	delete ring_buffer;

	return 0;
}

// int main()
// {
// 	// 单生产 单消费
// 	pthread_t p1,c1;
// 	RingBuffer<int> *bq = new RingBuffer<int>(5);
// 	pthread_create(&p1, nullptr, production, bq);
// 	pthread_create(&c1, nullptr, consume, bq);

// 	pthread_join(p1, nullptr);
// 	pthread_join(c1, nullptr);

// 	return 0;
// }